package tirateima.gui.componente;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Deque;
import javax.swing.BorderFactory;
import java.awt.Point;

import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;

import tirateima.util.UtilZoom;

/**
 * Componente grafico para representação de pilhas
 */
public class PilhaComponente extends JPanel implements ICopiavel, IZoom{

	protected ArrayDeque<JLabel> pilha = new ArrayDeque<JLabel>();
	private Color cor; 
	private Point posicao;
	private Dimension tamanho;
	private double proporcao;
	
	/**
	 * Construtor do componente.
	 * @param nomePilha
	 * @param Color cor
	 * @param Point posicao
	 * @param Dimension tamanho
	 */
    public PilhaComponente(String nomePilha, Color cor, Point posicao, Dimension tamanho) {
        this.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
        this.setBorder(BorderFactory.createTitledBorder(BorderFactory.createMatteBorder(0, 3, 3, 3, cor), nomePilha));
        this.setBounds(posicao.x, posicao.y, tamanho.width, tamanho.height);
        this.setName(nomePilha);
        this.cor = cor;
        this.posicao = posicao;
        this.tamanho = tamanho;
    }
    
    /**
     * Remove um item da pilha
     * @return O item removido
     * @see java.util.Deque#pop()
     */
    public String pop() {
        JLabel retorno = null;
        retorno = pilha.pop();
        return retorno.getText();

    }

    /**
     * Insere um item no topo da pilha
     * @param Item a ser inserido.
     * @see java.util.Deque#push(java.lang.Object)
     */
    public void push(String e) {
        JLabel label = new JLabel(e, JLabel.CENTER);
        label.setPreferredSize(new Dimension(this.getBounds().width - 20, 20));
        label.setBorder(BorderFactory.createEtchedBorder());
//        ImageIcon icon = new ImageIcon(getClass().getResource("/livro.png"));
//        label.setPreferredSize(new Dimension(this.getWidth() - 10,icon.getIconHeight()));
//        label.setIcon(icon);
        pilha.push(label);
        
    }

    /**
     * Retorna o item da pilha pelo número do índice
     * @param índice
     * @return
     */
    private JLabel getByIndex(int index){
        JLabel retorno = null;
        int cont = 0;
        for (JLabel item : pilha) {
            if(cont++ >= index){
                retorno = item;
                break;
            }
        }
        return retorno;
    }

    /**
     * Colore um item
     * @param Indice do item.
     * @param Cor
     */
    public void colorirItem(int item, Color cor){
        getByIndex(item).setForeground(cor);
        getByIndex(item).setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED,cor, cor.darker()));
    }

    /**
     * Descolore um item
     * @param Indice do item.
     */
    public void descolorirItem(int item){
        getByIndex(item).setForeground(Color.BLACK);
        getByIndex(item).setBorder(BorderFactory.createEmptyBorder());
    }

    /**
     * Atualiza o desenho do componente.
     */
    public void desenhaComponente() {
    	if(pilha == null) return;
    	
        this.removeAll();
        /*
         * insere itens em invisíveis para a pilha crescer de baixo para cima.
         */
        for(int i = 0;i<calculaMaximoItensPilha()-pilha.size(); i++){
        	JLabel label = new JLabel("",JLabel.CENTER);
            label.setPreferredSize(new Dimension(this.getBounds().width - 20,(int) (20 * UtilZoom.calculaProporcao(proporcao))));
            this.add(label);
        }
        /*
         * insere os itens da pilha
         */
        for (JLabel item : pilha) {
            this.add(item);
        }
    }
    
    /**
     * Método sobrescrito para redesenhar o componente com os novos itens inseridos.
     */
    @Override
    public void revalidate() {
    	desenhaComponente();
    	super.revalidate();
    }
    
    /**
     * Calcula quantos itens cabem na pilha baseado na altura.
     * @return
     */
    private int calculaMaximoItensPilha(){
    	if(tamanho != null){
    		return (int) ((((tamanho.height-15)/20) - 1));    		
    	} else {
    		return 0;
    	}
    }
    
    /* (non-Javadoc)
	 * @see tirateima.gui.componente.ICopiavel#criarCopia()
	 */
	@Override
	public JComponent criarCopia() {
		PilhaComponente retorno = new PilhaComponente(this.getName(), this.cor,  this.posicao, this.tamanho);
    	retorno.pilha = pilha.clone();
    	return retorno;
	}

	/*
	 * (non-Javadoc)
	 * @see tirateima.gui.componente.IZoom#setProporcao(double)
	 */
	@Override
	public void setProporcao(double prop) {
		proporcao = prop;
		this.setBounds((int)(posicao.x * UtilZoom.calculaProporcao(prop)), (int)(posicao.y * UtilZoom.calculaProporcao(prop)), (int)(tamanho.width * UtilZoom.calculaProporcao(prop)), (int)(tamanho.height * UtilZoom.calculaProporcao(prop)));
		for (JLabel item : pilha) {
			item.setFont(new Font(Font.DIALOG, Font.PLAIN, (int)(12 * proporcao)));
			item.setPreferredSize(new Dimension(this.getBounds().width - 20, (int)(20 * UtilZoom.calculaProporcao(prop))));           
        }
		this.revalidate();
	}
}
